# -*- coding: utf-8 -*-

from django.db import models
from django.forms import ModelForm
from django.contrib.auth.models import User
from django import forms
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse
from django.template import RequestContext
from django.contrib.auth.decorators import login_required
from django.shortcuts import render_to_response, get_object_or_404, get_list_or_404, redirect
from django.core.mail import send_mail, BadHeaderError
from django.contrib.auth.forms import *
from django.db.models.query_utils import Q
from si_4k.sistema.models import *
from si_4k.sistema.forms import *
from django.contrib.auth.forms import *
from datetime import *
from django.contrib.auth.forms import PasswordChangeForm
from PIL import *
from  django.contrib.auth.decorators import permission_required
from django.core.mail import send_mail
from decimal import *
from django.contrib import messages
from si_4k.xlwt import *
#prefixo = '/home/edu4k/webapps/static_media/'
prefixo = ''

@permission_required('sistema.perm_cadastro')   
def agenda_geral(request):
    return render_to_response('agenda_geral.html', locals(),  context_instance=RequestContext(request))
    
def valor_aula(id_aluno, local):
    aluno = Aluno.objects.get(id=id_aluno)
    try:
        preco_aula = PrecoAula.objects.get(unidade=local.unidade)
    except:
        unidade_aluno = aluno.unidade.all()[0]
        preco_aula = PrecoAula.objects.get(unidade=unidade_aluno)
    hoje = date.today()
    if local.nome != 'Casa do Aluno':
        if aluno.data_ingresso <= preco_aula.data_vigencia:
            if hoje >= preco_aula.data_limite:
                return preco_aula.aula_sozinho
            else:
                return preco_aula.aula_sozinho_novo
        else:
            return preco_aula.aula_sozinho_novo
    else:
        if aluno.data_ingresso <= preco_aula.data_vigencia:
            if hoje >= preco_aula.data_limite:
                return preco_aula.aula_sozinho_casa
            else:
                return preco_aula.aula_sozinho_casa_novo
        else:
            return preco_aula.aula_sozinho_casa_novo
    
def valor_aula_grupo(aula):
    preco_novo = False
    local = aula.local
    aluno1 = aula.aluno.all()[0]
    try:
        preco_aula = PrecoAula.objects.get(unidade=local.unidade)
    except:
        unidade_aluno = aluno.unidade.all()[0]
        preco_aula = PrecoAula.objects.get(unidade=unidade_aluno)
    hoje = date.today()
    for aluno in aula.aluno.all():
        if aluno.data_ingresso <= preco_aula.data_vigencia:
            if hoje <= preco_aula.data_limite:
                preco_novo = True
        else:
            preco_novo = True
    if local.nome != 'Casa do Aluno':
        if preco_novo:
            return preco_aula.aula_grupo_novo
        else:
            return preco_aula.aula_grupo
    else:
        if preco_novo:
            return preco_aula.aula_grupo_casa_novo
        else:
            return preco_aula.aula_grupo_casa

def duracao_aula(id_aula):
    aula = Aula.objects.get(id=id_aula)
    delta = aula.fim - aula.inicio
    return Decimal(delta.seconds)/3600
    
def verificar_credito(id_aula, id_aluno):
    aula = Aula.objects.get(id=id_aula)
    aluno = Aluno.objects.get(id=id_aluno)
    duracao = duracao_aula(id_aula)
    custo_aula = aula.valor*duracao
    if aluno.divida.valor <= -1*custo_aula:
        return True
    else:
        return False

def verificar_usuario(usuario, unidade):
    dados_usuario = usuario.get_profile()
    if not unidade == None:
        for unidade_usuario in dados_usuario.unidade.all():
            if unidade_usuario.nome == unidade.nome:
                return True
        return False
    else:
        return True

#Agenda do Professor
@permission_required('sistema.perm_cadastro')   
def agenda_tabela_prof(request):
    lista_professores = DetalheUsuario.objects.filter(cargo='Professor')
    return render_to_response('agenda_tabela_prof.html', locals(),  context_instance=RequestContext(request))

@permission_required('sistema.perm_cadastro')       
def agenda_prof(request, id_professor):
    detalheusuario = DetalheUsuario.objects.get(id=id_professor)
    professor = Professor.objects.get(detalheusuario=detalheusuario)
    lista_aulas = Aula.objects.filter(professor=professor).filter(valido=True)
    return render_to_response('agenda_prof.html', locals(),  context_instance=RequestContext(request))

@permission_required('sistema.perm_cadastro')       
def aula_prof(request, id_professor, inicio, fim):
    lista_materia = Referencias.objects.all().distinct()
    if request.method == 'GET':
        aula_form = AulaProfForm()
        start = inicio.split('-')
        end = fim.split('-')
        data_inicio = datetime(int(start[0]), int(start[1]), int(start[2]), int(start[3]), int(start[4]))
        data_fim = datetime(int(end[0]), int(end[1]), int(end[2]), int(end[3]), int(end[4]))
        lista_aulas = Aula.objects.filter(fim__gte=data_inicio).filter(inicio__lte=data_fim).filter(valido=True)
        lista_alunos = Aluno.objects.all()
        lista_locais = Local.objects.all()
        #condição: numero de salas de aula
        for local in lista_locais:
            for aula in lista_aulas:
                if(local.nome==aula.local.nome):
                    lista_locais = lista_locais.exclude(nome=aula.local.nome)
        if not lista_locais:
            lista_locais = lista_locais.filter(nome='Casa do Aluno')
        for aula in lista_aulas:
            for aluno in aula.aluno.all():
                lista_alunos = lista_alunos.exclude(nome=aluno.nome)
        return render_to_response('aula_prof.html', locals(),  context_instance=RequestContext(request))

@permission_required('sistema.perm_cadastro')           
def salvar_aula_prof(request, id_professor):
    aula_form = AulaProfForm(request.POST)
    local_nome = request.POST["local"]
    aluno_nome = request.POST['aluno']
    local = Local.objects.get(nome=local_nome)
    if verificar_usuario(request.user,local.unidade):
        if aula_form.is_valid():
            aula = aula_form.save(commit=False)
            professor = Professor.objects.get(id=id_professor)
            aluno = Aluno.objects.get(nome=aluno_nome)
            aula_existente = Aula.objects.filter(professor=professor).filter(inicio__lte=aula.fim).filter(fim__gte=aula.inicio).filter(valido=True)
            if aula_existente:
                messages.error(request,'Há um conflito de horário com outra aula.')
            else:
                aula.professor = professor
                aula.local = local
                aula.valido = True
                aula.valor = valor_aula(aluno.id, local)
                aula.save()
                aula.aluno.add(aluno)
                aula.save()
                relatorio_aula = RelatorioAula(aula=aula)
                relatorio_aula.save()
                pago = verificar_credito(aula.id, aluno.id)
                statusaula = StatusAula(aula=aula, aluno=aluno, pago=pago)
                statusaula.save()
                divida = aluno.divida
                duracao = duracao_aula(aula.id)
                divida.valor += aula.valor*duracao
                divida.save()
                try:
                    mensagem = 'Informamos que o aluno ' + aluno.nome + ' agendou uma aula para o dia ' + inicio.strftime("%d/%m/%y") + ' às ' + inicio.strftime("%H:%M")
                    send_mail('Notificação de pagamento', mensagem, 'financeiro@4keducacional.com.br' ,[aluno.email_1,aluno.email_2], fail_silently=False)
                except:
                    pass
                messages.success(request, 'Aula salva com sucesso!')
            return HttpResponseRedirect('/agenda_prof/'+id_professor+'/')
        messages.error(request,'Houve um problema ao criar a aula.')
        return HttpResponseRedirect('/agenda_prof/'+id_professor+'/')
    else:
        messages.error(request,'Você não tem permissão para criar aulas nesta unidade')
        return HttpResponseRedirect('/agenda_local/'+id_local+'/')

@permission_required('sistema.perm_cadastro')       
def edita_aula_prof(request, id_professor, id_aula):
    aula_edita = Aula.objects.get(id=id_aula)
    if request.method == 'GET':
        lista_aulas = Aula.objects.filter(fim__gte=aula_edita.inicio).filter(inicio__lte=aula_edita.fim).filter(valido=True)
        lista_alunos = Aluno.objects.all()
        for aula in lista_aulas:
            for aluno in aula.aluno.all():
                lista_alunos = lista_alunos.exclude(nome=aluno.nome)
    else:
        if verificar_usuario(request.user,local.unidade):
            duracao = duracao_aula(id_aula)
            for aluno in aula_edita.aluno.all():
                divida = aluno.divida
                divida.valor -= (aula_edita.valor)*duracao
                divida.save()
            nome_aluno = request.POST['aluno']
            aluno = Aluno.objects.get(nome=nome_aluno)
            aula_edita.aluno.add(aluno)
            try:
                mensagem = 'Informamos que o aluno ' + aluno.nome + ' agendou uma aula para o dia ' + aula_edita.inicio.strftime("%d/%m/%y") + ' às ' + aula_edita.inicio.strftime("%H:%M")
                send_mail('Notificação de pagamento', mensagem, 'financeiro@4keducacional.com.br' ,[aluno.email_1,aluno.email_2], fail_silently=False)
            except:
                pass
            aula_edita.save()
            aula_edita.valor = valor_aula_grupo(id_aula)
            aula_edita.save()
            for aluno in aula_edita.aluno.all():
                pago = verificar_credito(aula_edita.id, aluno.id)
                status_aula_existente = StatusAula.objects.filter(aluno=aluno).filter(aula=aula_edita)
                if not status_aula_existente:
                    statusaula = StatusAula(aula=aula_edita, aluno=aluno, pago=pago)
                    statusaula.save()
                divida = aluno.divida
                divida.valor += aula_edita.valor*duracao
                divida.save()
            messages.success(request,'Aluno adicionado com sucesso')
            return HttpResponseRedirect('/agenda_prof/'+id_professor+'/')
        else: 
            messages.error(request,'Você não tem permissão para criar aulas nesta unidade')
            return HttpResponseRedirect('/agenda_local/'+id_local+'/')
    return render_to_response('edita_aula_prof.html', locals(),  context_instance=RequestContext(request))

@permission_required('sistema.perm_cadastro')       
def deleta_aula_prof(request, id_professor, id_aula):
    aula = Aula.objects.get(id=id_aula)
    aula.valido = False
    aula.save()
    duracao = duracao_aula(id_aula)
    for aluno in aula.aluno.all():
        divida = aluno.divida
        divida.valor -= aula.valor*duracao
        divida.save()
    messages.success(request,'Aula deletada com sucesso!')
    return HttpResponseRedirect('/agenda_prof/'+id_professor+'/')
    
#Agenda do Local
@permission_required('sistema.perm_cadastro')   
def agenda_tabela_local(request):
    lista_locais = Local.objects.exclude(nome='Casa do Aluno')
    return render_to_response('agenda_tabela_local.html', locals(),  context_instance=RequestContext(request))

@permission_required('sistema.perm_cadastro')       
def agenda_local(request, id_local):
    lista_materia = Referencias.objects.all().distinct()
    local = Local.objects.get(id=id_local)
    lista_aulas = Aula.objects.filter(local=local).filter(valido=True)
    return render_to_response('agenda_local.html', locals(),  context_instance=RequestContext(request))

@permission_required('sistema.perm_cadastro')   
def aula_local(request, id_local, inicio, fim):
    lista_materia = Referencias.objects.all().distinct()
    if request.method == 'GET':
        aula_form = AulaLocalForm()
        start = inicio.split('-')
        end = fim.split('-')
        data_inicio = datetime(int(start[0]), int(start[1]), int(start[2]), int(start[3]), int(start[4]))
        data_fim = datetime(int(end[0]), int(end[1]), int(end[2]), int(end[3]), int(end[4]))
        lista_aulas = Aula.objects.filter(fim__gte=data_inicio).filter(inicio__lte=data_fim).filter(valido=True)
        lista_alunos = Aluno.objects.all()
        lista_professores = Professor.objects.all()
        #condição: numero de salas de aula
        for professor in lista_professores:
            for aula in lista_aulas:
                if(professor==aula.professor):
                    lista_professores = lista_professores.exclude(id=aula.professor.id)
        for aula in lista_aulas:
            for aluno in aula.aluno.all():
                lista_alunos = lista_alunos.exclude(nome=aluno.nome)
        return render_to_response('aula_local.html', locals(),  context_instance=RequestContext(request))

@permission_required('sistema.perm_cadastro')     
def salvar_aula_local(request, id_local):
    aula_form = AulaLocalForm(request.POST)
    professor_nome = request.POST["professor"]
    aluno_nome = request.POST['aluno']
    local = Local.objects.get(id=id_local)
    if verificar_usuario(request.user,local.unidade):
        if aula_form.is_valid():
            aula = aula_form.save(commit=False)
            aluno = Aluno.objects.get(nome=aluno_nome)
            professor = Professor.objects.get(detalheusuario__nome=professor_nome)
            aula_existente = Aula.objects.filter(local=local).filter(inicio__lte=aula.fim).filter(fim__gte=aula.inicio).filter(valido=True)
            if aula_existente:
                messages.error(request,'Há um conflito de horário com outra aula.')
            else:
                aula.professor = professor
                aula.local = local
                aula.valido = True
                aula.valor = valor_aula(aluno.id, local)
                aula.save()
                aula.aluno.add(aluno)
                aula.save()
                relatorio_aula = RelatorioAula(aula=aula)
                relatorio_aula.save()
                pago = verificar_credito(aula.id, aluno.id)
                statusaula = StatusAula(aula=aula, aluno=aluno, pago=False)
                statusaula.save()
                divida = aluno.divida
                duracao = duracao_aula(aula.id)
                divida.valor += aula.valor*duracao
                divida.save()
                try:
                    mensagem = 'Informamos que o aluno ' + aluno.nome + ' agendou uma aula para o dia ' + inicio.strftime("%d/%m/%y") + ' às ' + inicio.strftime("%H:%M")
                    send_mail('Notificação de pagamento', mensagem, 'financeiro@4keducacional.com.br' ,[aluno.email_1,aluno.email_2], fail_silently=False)
                except:
                    pass
                messages.success(request,'Aula salva com sucesso!')
            return HttpResponseRedirect('/agenda_local/'+id_local+'/')
        messages.error(request,'Houve um problema ao criar a aula.')
        return HttpResponseRedirect('/agenda_local/'+id_local+'/')
    messages.error(request,'Você não tem permissão para criar aulas nesta unidade')
    return HttpResponseRedirect('/agenda_local/'+id_local+'/')

@permission_required('sistema.perm_cadastro')       
def edita_aula_local(request, id_local, id_aula):
    aula_edita = Aula.objects.get(id=id_aula)
    if request.method == 'GET':
        lista_aulas = Aula.objects.filter(fim__gte=aula_edita.inicio).filter(inicio__lte=aula_edita.fim).filter(valido=True)
        lista_alunos = Aluno.objects.all()
        for aula in lista_aulas:
            for aluno in aula.aluno.all():
                lista_alunos = lista_alunos.exclude(nome=aluno.nome)
    else:
        if verificar_usuario(request.user,aula_edita.local.unidade):
            duracao = duracao_aula(id_aula)
            for aluno in aula_edita.aluno.all():
                divida = aluno.divida
                divida.valor -= aula_edita.valor*duracao
                divida.save()
            nome_aluno = request.POST['aluno']
            aluno = Aluno.objects.get(nome=nome_aluno)
            aula_edita.valor = valor_aula_grupo(aula_edita)
            aula_edita.aluno.add(aluno)
            aula_edita.save()
            try:
                mensagem = 'Informamos que o aluno ' + aluno.nome + ' agendou uma aula para o dia ' + aula_edita.inicio.strftime("%d/%m/%y") + ' às ' + aula_edita.inicio.strftime("%H:%M")
                send_mail('Notificação de pagamento', mensagem, 'financeiro@4keducacional.com.br' ,[aluno.email_1,aluno.email_2], fail_silently=False)
            except:
                pass
            for aluno in aula_edita.aluno.all():
                pago = verificar_credito(aula_edita.id, aluno.id)
                status_aula_existente = StatusAula.objects.filter(aluno=aluno).filter(aula=aula_edita)
                if not status_aula_existente:
                    statusaula = StatusAula(aula=aula_edita, aluno=aluno, pago=pago)
                    statusaula.save()
                divida = aluno.divida
                divida.valor += aula_edita.valor*duracao
                divida.save()
            messages.success(request,'Aula salva com sucesso!')
            return HttpResponseRedirect('/agenda_local/'+id_local+'/')
        else:
            messages.error(request,'Você não tem permissão para criar aulas nesta unidade')
            return HttpResponseRedirect('/agenda_local/'+id_local+'/')
    return render_to_response('edita_aula_local.html', locals(),  context_instance=RequestContext(request))

@permission_required('sistema.perm_cadastro')       
def deleta_aula_local(request, id_local, id_aula):
    aula = Aula.objects.get(id=id_aula)
    aula.valido = False
    aula.save()
    duracao = duracao_aula(id_aula)
    for aluno in aula.aluno.all():
        divida = aluno.divida
        divida.valor -= aula.valor*duracao
        divida.save()
    messages.success(request,'Aula deletada com sucesso!')
    return HttpResponseRedirect('/agenda_local/'+id_local+'/')
    
#Agenda Aluno
@permission_required('sistema.perm_cadastro')   
def agenda_tabela_aluno(request):
    lista_alunos = Aluno.objects.all()
    return render_to_response('agenda_tabela_aluno.html', locals(),  context_instance=RequestContext(request))

@permission_required('sistema.perm_cadastro')   
def agenda_aluno(request, id_aluno):
    aluno = Aluno.objects.get(id=id_aluno)
    lista_aulas = Aula.objects.filter(aluno=aluno).filter(valido=True)
    return render_to_response('agenda_aluno.html', locals(),  context_instance=RequestContext(request))

@permission_required('sistema.perm_cadastro')   
def aula_aluno(request, id_aluno, inicio, fim):
    if request.method == 'GET':
        aula_form = AulaLocalForm()
        aluno = Aluno.objects.get(id=id_aluno)
        start = inicio.split('-')
        end = fim.split('-')
        data_inicio = datetime(int(start[0]), int(start[1]), int(start[2]), int(start[3]), int(start[4]))
        data_fim = datetime(int(end[0]), int(end[1]), int(end[2]), int(end[3]), int(end[4]))
        lista_aulas = Aula.objects.filter(fim__gte=data_inicio).filter(inicio__lte=data_fim).filter(valido=True)
        lista_locais = Local.objects.filter(unidade=aluno.unidade.all())
        lista_professores = Professor.objects.filter(detalheusuario__unidade=aluno.unidade.all())
        lista_materia = Referencias.objects.all().distinct()
        #condição: numero de salas de aula
        for professor in lista_professores:
            for aula in lista_aulas:
                if(professor==aula.professor):
                    lista_professores = lista_professores.exclude(id=aula.professor.id)
        for aula in lista_aulas:
            lista_locais = lista_locais.exclude(id=aula.local.id)
        return render_to_response('aula_aluno.html', locals(),  context_instance=RequestContext(request))

@permission_required('sistema.perm_cadastro')           
def salvar_aula_aluno(request, id_aluno):
    aula_form = AulaLocalForm(request.POST)
    professor_nome = request.POST["professor"]
    local_nome = request.POST['local']
    local = Local.objects.get(nome=local_nome)
    if verificar_usuario(request.user,local.unidade):
        if aula_form.is_valid():
            aula = aula_form.save(commit=False)
            professor = Professor.objects.get(detalheusuario__nome=professor_nome)
            aluno = Aluno.objects.get(id=id_aluno)
            aula_existente = Aula.objects.filter(aluno=aluno).filter(inicio__lte=aula.fim).filter(fim__gte=aula.inicio).filter(valido=True)
            if aula_existente:
                messages.error(request,'Há um conflito de horário com outra aula.')
            else:
                aula.professor = professor
                aula.local = local
                aula.valido = True
                aula.valor = valor_aula(aluno.id, local)
                aula.save()
                aula.aluno.add(aluno)
                aula.save()
                relatorio_aula = RelatorioAula(aula=aula)
                relatorio_aula.save()
                pago = verificar_credito(aula.id, aluno.id)
                statusaula = StatusAula(aula=aula, aluno=aluno, pago=False)
                statusaula.save()
                divida = aluno.divida
                duracao = duracao_aula(aula.id)
                divida.valor += aula.valor*duracao
                divida.save()
                try:
                    mensagem = 'Informamos que o aluno ' + aluno.nome + ' agendou uma aula para o dia ' + inicio.strftime("%d/%m/%y") + ' às ' + inicio.strftime("%H:%M")
                    send_mail('Notificação de pagamento', mensagem, 'financeiro@4keducacional.com.br' ,[aluno.email_1,aluno.email_2], fail_silently=False)
                except:
                    pass
                messages.success(request,'Aula salva com sucesso!')
            return HttpResponseRedirect('/agenda_aluno/'+id_aluno+'/')
        messages.error(request,'Houve um problema ao criar a aula.')
        return HttpResponseRedirect('/agenda_aluno/'+id_aluno+'/')
    messages.error(request,'Você não tem permissão para cadastrar aulas desta unidade')
    return HttpResponseRedirect('/agenda_aluno/'+id_aluno+'/')
    
@permission_required('sistema.perm_cadastro')       
def edita_aula_aluno(request, id_aluno, id_aula):
    aula_edita = Aula.objects.get(id=id_aula)
    if request.method == 'GET':
        lista_aulas = Aula.objects.filter(fim__gte=aula_edita.inicio).filter(inicio__lte=aula_edita.fim).filter(valido=True)
        lista_alunos = Aluno.objects.all()
        for aula in lista_aulas:
            for aluno in aula.aluno.all():
                lista_alunos = lista_alunos.exclude(nome=aluno.nome)
    else:
        if verificar_usuario(request.user,aula_edita.local.unidade):
            duracao = duracao_aula(id_aula)
            for aluno in aula_edita.aluno.all():
                divida = aluno.divida
                divida.valor -= aula_edita.valor*duracao
                divida.save()
            nome_aluno = request.POST['aluno']
            aluno = Aluno.objects.get(nome=nome_aluno)
            aula_edita.valor = valor_aula_grupo(aula_edita)
            aula_edita.aluno.add(aluno)
            aula_edita.save()
            try:
                mensagem = 'Informamos que o aluno ' + aluno.nome + ' agendou uma aula para o dia ' + aula_edita.inicio.strftime("%d/%m/%y") + ' às ' + aula_edita.inicio.strftime("%H:%M")
                send_mail('Notificação de pagamento', mensagem, 'financeiro@4keducacional.com.br' ,[aluno.email_1,aluno.email_2], fail_silently=False)
            except:
                pass
            for aluno in aula_edita.aluno.all():
                pago = verificar_credito(aula_edita.id, aluno.id)
                status_aula_existente = StatusAula.objects.filter(aluno=aluno).filter(aula=aula_edita)
                if not status_aula_existente:
                    statusaula = StatusAula(aula=aula_edita, aluno=aluno, pago=pago)
                    statusaula.save()
                divida = aluno.divida
                divida.valor += aula_edita.valor*duracao
                divida.save()
            messages.success(request,'Aluno adicionado com sucesso!')
        else:
            messages.error(request,'Você não tem permissão para cadastrar aulas desta unidade')
        return HttpResponseRedirect('/agenda_aluno/'+id_aluno+'/')
    return render_to_response('edita_aula_aluno.html', locals(),  context_instance=RequestContext(request))

@permission_required('sistema.perm_cadastro')       
def deleta_aula_aluno(request, id_aluno, id_aula):
    aula = Aula.objects.get(id=id_aula)
    aula.valido = False
    aula.save()
    duracao = duracao_aula(id_aula)
    for aluno in aula.aluno.all():
        divida = aluno.divida
        divida.valor -= aula.valor*duracao
        divida.save()
    messages.success(request,'Aula deletada com sucesso!')
    return HttpResponseRedirect('/agenda_aluno/'+id_aluno+'/')